package coba;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Date;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.lang.StringBuilder;
import java.util.Calendar;
import java.util.GregorianCalendar;

import javax.portlet.ActionRequest;
import javax.portlet.ActionResponse;
import javax.portlet.PortletException;
import javax.portlet.ResourceRequest;
import javax.portlet.ResourceResponse;
import javax.portlet.WindowStateException;
import javax.servlet.http.HttpSession;

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import coba.calendar.Disponibilidad;
import coba.calendar.DisponibilidadGuias;
import coba.excel.CoordinadorRow;
import coba.excel.EnfermedadIdFromNombre;
import coba.excel.ParsearCoordinadores;
import coba.excel.ParsearParticipantes;
import coba.excel.ParticipanteRow;
import coba.excel.ValidarCoordinadores;
import coba.excel.ValidarParticipantes;
import coba.excel.export.solicitud.CreateFilterMapFromSession;
import coba.excel.export.solicitud.DumpSolicitudesIntoSheet;
import coba.model.Contacto;
import coba.model.Feriado;
import coba.model.FormularioCoordinador;
import coba.model.FormularioGrupo;
import coba.model.FormularioParticipante;
import coba.model.Guia;
import coba.model.Institucion;
import coba.model.Itinerario;
import coba.model.ItinerarioRecorrido;
import coba.model.LicenciaGuia;
import coba.model.Recorrido;
import coba.model.Solicitud;
import coba.service.ContactoLocalServiceUtil;
import coba.service.FeriadoLocalServiceUtil;
import coba.service.FormularioCoordinadorLocalServiceUtil;
import coba.service.FormularioGrupoLocalServiceUtil;
import coba.service.FormularioParticipanteLocalServiceUtil;
import coba.service.GuiaLocalServiceUtil;
import coba.service.InstitucionLocalServiceUtil;
import coba.service.ItinerarioLocalServiceUtil;
import coba.service.ItinerarioRecorridoLocalServiceUtil;
import coba.service.LicenciaGuiaLocalServiceUtil;
import coba.service.RecorridoLocalServiceUtil;
import coba.service.SolicitudLocalServiceUtil;
import coba.service.SolicitudItinerarioLocalServiceUtil;
import coba.util.SQLSolicitudes;
import coba.util.SolicitudId;

import com.liferay.counter.service.CounterLocalServiceUtil;
import com.liferay.portal.kernel.exception.PortalException;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.servlet.HttpHeaders;
import com.liferay.portal.kernel.servlet.SessionErrors;
import com.liferay.portal.kernel.servlet.SessionMessages;
import com.liferay.portal.kernel.upload.UploadPortletRequest;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.model.User;
import com.liferay.portal.theme.ThemeDisplay;
import com.liferay.portal.util.PortalUtil;
import com.liferay.util.bridges.mvc.MVCPortlet;


public class AgendaPortlet extends MVCPortlet {
	public void altaSolicitud(ActionRequest r, ActionResponse response) throws SystemException, IOException, NumberFormatException, ParseException, PortalException {
		Calendar itFecha = GregorianCalendar.getInstance();
		itFecha.set(Calendar.YEAR, 2015);
		itFecha.set(Calendar.MONTH, 8);
		itFecha.set(Calendar.DAY_OF_MONTH, 1);
		
		if (itFecha.getTime().compareTo(new Date()) < 0) {
			return;
		}
		
		Date hoy = new Date();
		
    	User usuario = obtenerUsuario(r);
    	
    	
    	Calendar calendar = GregorianCalendar.getInstance();

    	calendar.set(Calendar.YEAR, Integer.valueOf(text("itinerarioAnio", r)));
    	calendar.set(Calendar.MONTH, Integer.valueOf(text("itinerarioMes", r)));
    	calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(text("itinerarioDia", r)));
    	calendar.set(Calendar.HOUR_OF_DAY, 0);
    	calendar.set(Calendar.MINUTE, 0);
    	calendar.set(Calendar.SECOND, 0);
    	calendar.set(Calendar.MILLISECOND, 0);
    	
    	Date fechaItinerario = calendar.getTime();

		Itinerario itinerario = ItinerarioLocalServiceUtil.getItinerario(num("itinerarioId", r));
		
		
		List<Itinerario> listItinerario = ItinerarioLocalServiceUtil.getItinerarios(0, 999999);
		List<ItinerarioRecorrido> listItinerarioRecorrido = ItinerarioRecorridoLocalServiceUtil.getItinerarioRecorridos(0, 999999);
		List<Recorrido> listRecorrido = RecorridoLocalServiceUtil.getRecorridos(0, 999999);
		List<Guia> listGuia = GuiaLocalServiceUtil.findByFechaBaja(null);
		List<LicenciaGuia> listLicenciaGuia = LicenciaGuiaLocalServiceUtil.findByFechaBaja(null);
		List<Solicitud> listSolicitud = SolicitudLocalServiceUtil.findByFechaItinerarioAndFechaBaja(fechaItinerario, null);

		long disponibilidadItinerario = Disponibilidad.getByItinerario(listSolicitud, Integer.valueOf(text("itinerarioAnio", r)), Integer.valueOf(text("itinerarioMes", r)), Integer.valueOf(text("itinerarioDia", r)), listItinerarioRecorrido, listRecorrido, itinerario.getId());
		long guiasDisponibles = DisponibilidadGuias.get(listSolicitud, Integer.valueOf(text("itinerarioAnio", r)), Integer.valueOf(text("itinerarioMes", r)), Integer.valueOf(text("itinerarioDia", r)), listGuia, listLicenciaGuia);

		if (disponibilidadItinerario != num("disponibilidadItinerario", r) ||
				guiasDisponibles != num("guiasDisponibles", r)) {
			for (String parameterName : r.getParameterMap().keySet()) {
				response.setRenderParameter(parameterName, r.getParameter(parameterName));
			}
			
    		SessionErrors.add(r, "cambioDisponibilidad");
    		response.setRenderParameter("jspPage", "/views/solicitud/alta.jsp");
    		return;
		}

		
		/*
    	long disponibilidad = ItinerarioLocalServiceUtil.disponibilidad(
    			itinerario.getId(),
    			fechaItinerario);
    	
    	if (disponibilidad < num("cantidadParticipantes", r)) {
    		response.setRenderParameter("itinerarioId", text("itinerarioId", r));
    		response.setRenderParameter("itinerarioAnio", text("itinerarioAnio", r));
    		response.setRenderParameter("itinerarioMes", text("itinerarioMes", r));
    		response.setRenderParameter("itinerarioDia", text("itinerarioDia", r));
    		response.setRenderParameter("modalidad", text("modalidad", r));
    		response.setRenderParameter("contacto", text("contacto", r));
    		response.setRenderParameter("cantidadParticipantes", text("cantidadParticipantes", r));
    		response.setRenderParameter("cantidadCoordinadores", text("cantidadCoordinadores", r));
    		response.setRenderParameter("cantidadMicros", text("cantidadMicros", r));
    		response.setRenderParameter("discapacidad", text("discapacidad", r));
    		response.setRenderParameter("cantidadPersonasDiscapacidad", text("cantidadPersonasDiscapacidad", r));
    		if (text("microGratis", r) != null)
    			response.setRenderParameter("microGratis", text("microGratis", r));
    		response.setRenderParameter("observaciones", text("observaciones", r));
    		response.setRenderParameter("redirectTo", text("redirectTo", r));
    		
    		SessionErrors.add(r, "sinDisponibilidad");
    		response.setRenderParameter("jspPage", "/views/solicitud/alta.jsp");
    		return;
    	}*/
    	
		/*
    	long id = this.generarId(Solicitud.class);
    	Solicitud solicitud = SolicitudLocalServiceUtil.getService().createSolicitud(id);
    	solicitud.setModalidad(itinerario.getModalidad());
    	solicitud.setContactoId(num("contacto", r));
    	solicitud.setCantidadParticipantes(num("cantidadParticipantes", r));
    	solicitud.setCantidadCoordinadores(num("cantidadCoordinadores", r));
    	solicitud.setCantidadMicros(num("cantidadMicros", r));
    	solicitud.setDiscapacidad(num("discapacidad", r));
    	solicitud.setCantidadPersonasDiscapacidad(num("cantidadPersonasDiscapacidad", r));
    	solicitud.setMicroGratis(text("microGratis", r));
    	solicitud.setObservaciones(text("observaciones", r));
    	solicitud.setFechaAlta(new Date());
    	solicitud.setUsuarioId(usuario.getUserId());
    	solicitud.setItinerarioId(itinerario.getId());
    	solicitud.setFechaAsignacionItinerario(hoy);
    	solicitud.setFechaItinerario(fechaItinerario);
    	solicitud.setNumero(NumeracionSolicitudLocalServiceUtil.proximoNumero());
    	
    	SolicitudLocalServiceUtil.addSolicitud(solicitud);
    	*/
    	
    	/*
		ConcurrenciaRecorridoLocalServiceUtil.updateItinerario(
				solicitud.getItinerarioId(),
				solicitud.getFechaItinerario(),
				solicitud.getCantidadParticipantes());
		/*
		
		/* generar formulario */
		/*
    	long idFormulario = this.generarId(FormularioGrupo.class);
    	FormularioGrupo formularioGrupo = FormularioGrupoLocalServiceUtil.createFormularioGrupo(idFormulario);
    	formularioGrupo.setSolicitudId(id);
    	formularioGrupo.setCodigoUnico(java.util.UUID.randomUUID().toString());
    	FormularioGrupoLocalServiceUtil.addFormularioGrupo(formularioGrupo);
    	*/
		
		List<Long> listGuiaId = new LinkedList<Long>();
		for (String parameterName : r.getParameterMap().keySet()) {
			if (parameterName.contains("guia_")) {
				listGuiaId.add(num(parameterName, r).longValue());
			}
		}
		
		SolicitudLocalServiceUtil.add(
				num("contacto", r),
				num("cantidadParticipantes", r),
				num("cantidadCoordinadores", r),
				num("cantidadMicros", r),
				num("discapacidad", r),
				text("cantidadPersonasDiscapacidad", r) != null &&
						!"".equals(text("cantidadPersonasDiscapacidad", r)) ?
						num("cantidadPersonasDiscapacidad", r) : 0L,
				text("microGratis", r),
				text("observaciones", r),
				itinerario.getId(),
				fechaItinerario,
				listGuiaId,
				usuario.getUserId());

		
    	SessionMessages.add(r, "success");
    	response.sendRedirect(text("redirectTo", r));
	}
	
	public void editarSolicitud(ActionRequest r, ActionResponse response) throws SystemException, IOException, PortalException, NumberFormatException, ParseException {
		Date hoy = new Date();
		
		User usuario = obtenerUsuario(r);

		Calendar calendar = GregorianCalendar.getInstance();

		calendar.set(Calendar.YEAR, Integer.valueOf(text("itinerarioAnio", r)));
		calendar.set(Calendar.MONTH, Integer.valueOf(text("itinerarioMes", r)));
		calendar.set(Calendar.DAY_OF_MONTH, Integer.valueOf(text("itinerarioDia", r)));
		calendar.set(Calendar.HOUR_OF_DAY, 0);
		calendar.set(Calendar.MINUTE, 0);
		calendar.set(Calendar.SECOND, 0);
		calendar.set(Calendar.MILLISECOND, 0);
		
		Date fechaNuevoItinerario = calendar.getTime();
		
		Solicitud solicitud = SolicitudLocalServiceUtil.getSolicitud(num("id", r));
		Itinerario nuevoItinerario = ItinerarioLocalServiceUtil.getItinerario(num("itinerarioId", r));
		
		List<Itinerario> listItinerario = ItinerarioLocalServiceUtil.getItinerarios(0, 999999);
		List<ItinerarioRecorrido> listItinerarioRecorrido = ItinerarioRecorridoLocalServiceUtil.getItinerarioRecorridos(0, 999999);
		List<Recorrido> listRecorrido = RecorridoLocalServiceUtil.getRecorridos(0, 999999);
		List<Guia> listGuia = GuiaLocalServiceUtil.findByFechaBaja(null);
		List<LicenciaGuia> listLicenciaGuia = LicenciaGuiaLocalServiceUtil.findByFechaBaja(null);
		List<Solicitud> listSolicitud = SolicitudLocalServiceUtil.findByFechaItinerarioAndFechaBaja(fechaNuevoItinerario, null);

		long disponibilidadItinerario = Disponibilidad.getByItinerario(listSolicitud, Integer.valueOf(text("itinerarioAnio", r)), Integer.valueOf(text("itinerarioMes", r)), Integer.valueOf(text("itinerarioDia", r)), listItinerarioRecorrido, listRecorrido, nuevoItinerario.getId());
		long guiasDisponibles = DisponibilidadGuias.get(listSolicitud, Integer.valueOf(text("itinerarioAnio", r)), Integer.valueOf(text("itinerarioMes", r)), Integer.valueOf(text("itinerarioDia", r)), listGuia, listLicenciaGuia);
		
		Calendar cal1 = GregorianCalendar.getInstance();
		cal1.setTime(solicitud.getFechaItinerario());
	
		if (cal1.get(Calendar.YEAR) == calendar.get(Calendar.YEAR) &&
				cal1.get(Calendar.MONTH) == calendar.get(Calendar.MONTH) &&
				cal1.get(Calendar.DAY_OF_MONTH) == calendar.get(Calendar.DAY_OF_MONTH) &&
				solicitud.getItinerarioId() == nuevoItinerario.getId()) {
			disponibilidadItinerario += solicitud.getCantidadParticipantes();
			guiasDisponibles += solicitud.getCantidadMicros();
		}

		if (disponibilidadItinerario != num("disponibilidadItinerario", r) ||
				guiasDisponibles != num("guiasDisponibles", r)) {
			for (String parameterName : r.getParameterMap().keySet()) {
				response.setRenderParameter(parameterName, r.getParameter(parameterName));
			}
			
    		SessionErrors.add(r, "cambioDisponibilidad");
    		response.setRenderParameter("jspPage", "/views/solicitud/alta.jsp");
    		return;
		}

		
		// restar participantes para el calculo de disponibilidad
		/*
		ConcurrenciaRecorridoLocalServiceUtil.updateItinerario(solicitud.getItinerarioId(),
				solicitud.getFechaItinerario(),
				-solicitud.getCantidadParticipantes());


		long disponibilidad = ItinerarioLocalServiceUtil.disponibilidad(
				nuevoItinerario.getId(),
				fechaNuevoItinerario);

		if (disponibilidad < num("cantidadParticipantes", r)) {
			// reestablecer los participantes
			ConcurrenciaRecorridoLocalServiceUtil.updateItinerario(solicitud.getItinerarioId(),
					solicitud.getFechaItinerario(),
					solicitud.getCantidadParticipantes());
			
			response.setRenderParameter("itinerarioId", text("itinerarioId", r));
			response.setRenderParameter("itinerarioAnio", text("itinerarioAnio", r));
			response.setRenderParameter("itinerarioMes", text("itinerarioMes", r));
			response.setRenderParameter("itinerarioDia", text("itinerarioDia", r));
			response.setRenderParameter("modalidad", text("modalidad", r));
			response.setRenderParameter("contacto", text("contacto", r));
			response.setRenderParameter("cantidadParticipantes", text("cantidadParticipantes", r));
			response.setRenderParameter("cantidadCoordinadores", text("cantidadCoordinadores", r));
			response.setRenderParameter("cantidadMicros", text("cantidadMicros", r));
			response.setRenderParameter("discapacidad", text("discapacidad", r));
			response.setRenderParameter("cantidadPersonasDiscapacidad", text("cantidadPersonasDiscapacidad", r));
			if (text("microGratis", r) != null)
				response.setRenderParameter("microGratis", text("microGratis", r));
			response.setRenderParameter("observaciones", text("observaciones", r));
			response.setRenderParameter("redirectTo", text("redirectTo", r));

			SessionErrors.add(r, "sinDisponibilidad");
			response.setRenderParameter("jspPage", "/views/solicitud/alta.jsp");
			return;
		}
		*/
		
		/*
		solicitud.setModalidad(nuevoItinerario.getModalidad());
		solicitud.setContactoId(num("contacto", r));
		solicitud.setCantidadParticipantes(num("cantidadParticipantes", r));
		solicitud.setCantidadCoordinadores(num("cantidadCoordinadores", r));
		solicitud.setCantidadMicros(num("cantidadMicros", r));
		solicitud.setDiscapacidad(num("discapacidad", r));
		solicitud.setCantidadPersonasDiscapacidad(num("cantidadPersonasDiscapacidad", r));
		solicitud.setMicroGratis(text("microGratis", r));
		solicitud.setObservaciones(text("observaciones", r));
		solicitud.setItinerarioId(nuevoItinerario.getId());
		solicitud.setFechaItinerario(fechaNuevoItinerario);
		solicitud.setFechaAsignacionItinerario(hoy);

		SolicitudLocalServiceUtil.updateSolicitud(solicitud);
*/
		/*
		ConcurrenciaRecorridoLocalServiceUtil.updateItinerario(
				solicitud.getItinerarioId(),
				solicitud.getFechaItinerario(),
				solicitud.getCantidadParticipantes());
				*/

		List<Long> listGuiaId = new LinkedList<Long>();
		for (String parameterName : r.getParameterMap().keySet()) {
			if (parameterName.contains("guia_")) {
				listGuiaId.add(num(parameterName, r).longValue());
			}
		}
		
		SolicitudLocalServiceUtil.update(
				num("id", r),
				num("contacto", r),
				num("cantidadParticipantes", r),
				num("cantidadCoordinadores", r),
				num("cantidadMicros", r),
				num("discapacidad", r),
				text("cantidadPersonasDiscapacidad", r) != null &&
						!"".equals(text("cantidadPersonasDiscapacidad", r)) ?
						num("cantidadPersonasDiscapacidad", r) : 0L,
				text("microGratis", r),
				text("observaciones", r),
				nuevoItinerario.getId(),
				fechaNuevoItinerario,
				listGuiaId);

		SessionMessages.add(r, "editada");
		response.sendRedirect(text("redirectTo", r));
	}
	
	public void eliminarSolicitud(ActionRequest r, ActionResponse response) throws SystemException, PortalException, IOException {
		Date today = new Date();
		User usuario = obtenerUsuario(r);
		long id = num("id", r);
		
		Solicitud solicitud = SolicitudLocalServiceUtil.getSolicitud(id);
		
		solicitud.setFechaBaja(today);
		solicitud.setUsuarioBaja(usuario.getUserId());
		
		SolicitudLocalServiceUtil.updateSolicitud(solicitud);
		
		// restar participantes para el calculo de disponibilidad
		/*
		ConcurrenciaRecorridoLocalServiceUtil.updateItinerario(solicitud.getItinerarioId(),
				solicitud.getFechaItinerario(),
				-solicitud.getCantidadParticipantes());
				*/
		
    	SessionMessages.add(r, "eliminado");
    	//response.setRenderParameter("jspPage", "/views/solicitud/listado.jsp");
    	response.sendRedirect((String)PortalUtil.getHttpServletRequest(r).getSession().getAttribute("solicitud_ver_redirectTo"));
	}
	
	public void seleccionarSolicitud(ActionRequest r, ActionResponse response) {
		response.setRenderParameter("id", text("id", r));
		response.setRenderParameter("jspPage", "/views/solicitud/ver.jsp");
	}
	
	public void altaContacto(ActionRequest r, ActionResponse response) throws SystemException {
		User usuario = obtenerUsuario(r);
		
    	long id = this.generarId(Contacto.class);
    	Contacto contacto = ContactoLocalServiceUtil.getService().createContacto(id);
    	contacto.setInstitucionId(num("institucion", r));
    	contacto.setApellido(text("apellido", r));
    	contacto.setNombre(text("nombre", r));
    	contacto.setTelefono(text("telefono", r));
    	contacto.setInterno(text("interno", r));
    	contacto.setTelefono2(text("telefono2", r));
    	contacto.setInterno2(text("interno2", r));
    	contacto.setEmail(text("email", r));
    	contacto.setFechaAlta(new Date());
    	contacto.setUsuarioId(usuario.getUserId());
    	ContactoLocalServiceUtil.addContacto(contacto);
    	
    	SessionMessages.add(r, "success");
    	response.setRenderParameter("jspPage", "/views/contacto/listado.jsp");
    	
    	String sigo = text("seguirFiltrando", r);
    	if (sigo != "" && sigo != null)
    		response.setRenderParameter("institucionId", text("institucion", r));
	}
	
	public void editarContacto(ActionRequest r, ActionResponse response) throws SystemException, PortalException {
		long id = num("id", r);
		
    	Contacto contacto = ContactoLocalServiceUtil.getService().getContacto(id);
    	contacto.setInstitucionId(num("institucion", r));
    	contacto.setApellido(text("apellido", r));
    	contacto.setNombre(text("nombre", r));
    	contacto.setTelefono(text("telefono", r));
    	contacto.setInterno(text("interno", r));
    	contacto.setTelefono2(text("telefono2", r));
    	contacto.setInterno2(text("interno2", r));
    	contacto.setEmail(text("email", r));
    	
    	ContactoLocalServiceUtil.updateContacto(contacto);
    	
    	SessionMessages.add(r, "editada");
    	response.setRenderParameter("jspPage", "/views/contacto/listado.jsp");
	}
	
	public void altaInstitucion(ActionRequest r, ActionResponse response) throws SystemException {
		User usuario = obtenerUsuario(r);
		
    	long id = this.generarId(Contacto.class);
    	Institucion institucion = InstitucionLocalServiceUtil.getService().createInstitucion(id);
    	institucion.setProvinciaId(num("provincia", r));
    	institucion.setNombre(text("nombre", r));
    	institucion.setLocalidad(text("localidad", r));
    	institucion.setCalle(text("calle", r));
    	if (text("altura", r) != null && !text("altura", r).trim().equals(""))
    		institucion.setAltura(num("altura", r));
    	institucion.setDto(text("dto", r));
    	institucion.setCodigoPostal(text("codigoPostal", r));
    	institucion.setFechaAlta(new Date());
    	institucion.setUsuarioId(usuario.getUserId());
    	InstitucionLocalServiceUtil.addInstitucion(institucion);
    	
    	SessionMessages.add(r, "success");
    	response.setRenderParameter("jspPage", "/views/institucion/listado.jsp");
    	
    	String sigo = text("seguirFiltrando", r);
    	if (sigo != "" && sigo != null)
    		response.setRenderParameter("provinciaId", text("provincia", r));
	}
	
	public void editarInstitucion(ActionRequest r, ActionResponse response) throws SystemException, PortalException {
		long id = num("id", r);

		Institucion institucion = InstitucionLocalServiceUtil.getService().getInstitucion(id);
    	institucion.setProvinciaId(num("provincia", r));
    	institucion.setNombre(text("nombre", r));
    	institucion.setLocalidad(text("localidad", r));
    	institucion.setCalle(text("calle", r));
    	institucion.setAltura(num("altura", r));
    	institucion.setDto(text("dto", r));
    	institucion.setCodigoPostal(text("codigoPostal", r));
    	InstitucionLocalServiceUtil.updateInstitucion(institucion);
    	
    	SessionMessages.add(r, "editada");
    	response.setRenderParameter("provinciaId", text("provincia", r));
    	response.setRenderParameter("jspPage", "/views/institucion/listado.jsp");
	}
		
	public void eliminarInstitucion(ActionRequest r, ActionResponse response) throws SystemException, PortalException {
    	InstitucionLocalServiceUtil.getService().deleteInstitucion(num("id", r));
    	SessionMessages.add(r, "eliminado");
    	response.setRenderParameter("jspPage", "/views/institucion/listado.jsp");
	}
	
	public void eliminarContacto(ActionRequest r, ActionResponse response) throws SystemException, PortalException {
    	ContactoLocalServiceUtil.getService().deleteContacto(num("id", r));
    	SessionMessages.add(r, "eliminado");
    	response.setRenderParameter("jspPage", "/views/contacto/listado.jsp");
	}

	public void agregarCoordinador(ActionRequest r, ActionResponse response) throws SystemException, PortalException, IOException {
    	long id = this.generarId(FormularioCoordinador.class);
    	FormularioCoordinador form = FormularioCoordinadorLocalServiceUtil.getService().createFormularioCoordinador(id);
    	
    	FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(text("codigoUnico", r));
    	
    	form.setFormularioId(grupo.getId());
    	form.setNombre(text("nombre", r));
    	form.setApellido(text("apellido", r));
    	form.setGenero(text("genero", r).substring(0, 1).trim().equals("M") ? 0 : 1);
    	form.setDni(text("dni", r));
    	form.setTelefono(text("telefono", r));
    	form.setMail(text("email", r));
    	form.setEspecificacionesAlimenticias(text("especificacionesalimenticias", r));
    	form.setEnfermedades(num("enfermedades", r).longValue());
    	form.setObservaciones(text("observaciones", r));
    	
    	FormularioCoordinadorLocalServiceUtil.addFormularioCoordinador(form);
    	
    	SessionMessages.add(r, "agregado");
    	
    	response.sendRedirect(text("redirectTo", r));
	}
	
	public void borrarCoordinador(ActionRequest r, ActionResponse response) throws SystemException, PortalException, IOException {
		FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(text("codigoUnico", r));
		
		FormularioCoordinadorLocalServiceUtil.getService().deleteFormularioCoordinador(num("idCoordinador", r));
		
		SessionMessages.add(r, "eliminado");
		
		response.sendRedirect(text("redirectTo", r));
	}
	
	public void agregarParticipante(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, IOException {
    	long id = this.generarId(FormularioParticipante.class);
    	FormularioParticipante form = FormularioParticipanteLocalServiceUtil.getService().createFormularioParticipante(id);
    	
    	FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(text("codigoUnico", r));
    	
    	form.setFormularioId(grupo.getId());
    	form.setNombre(text("nombre", r));
    	form.setApellido(text("apellido", r));
    	form.setGenero(text("genero", r).substring(0, 1).trim().equals("M") ? 0 : 1);
    	form.setDni(text("dni", r));
    	form.setTelEmergencia(text("telefonodeemergencia", r));
    	form.setMail(text("email", r));
    	form.setEspecificacionesAlimenticias(text("especificacionesalimenticias", r));
    	if (text("nacimiento", r) != null && !text("nacimiento", r).trim().equals("")) {
    		try {
    			form.setFechaNacimiento(new SimpleDateFormat("dd/MM/yyyy").parse(text("nacimiento", r)));
    		}
    		catch (Exception e) {
    		}
    	}
    	form.setEnfermedades(num("enfermedades", r).longValue());
    	form.setObservaciones(text("observaciones", r));
    	
    	FormularioParticipanteLocalServiceUtil.addFormularioParticipante(form);
    	
    	SessionMessages.add(r, "agregado");    	
    	response.sendRedirect(text("redirectTo", r));
    	
	}

	public void borrarParticipante(ActionRequest r, ActionResponse response) throws SystemException, PortalException, IOException {
		FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(text("codigoUnico", r));
		
		FormularioParticipanteLocalServiceUtil.getService().deleteFormularioParticipante(num("idParticipante", r));
		
		SessionMessages.add(r, "eliminado");
		
		response.sendRedirect(text("redirectTo", r));
	}

	public void enviarFormulario(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException {
    	FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(text("codigoUnico", r));
    	grupo.setFechaEnvio(new Date());
    	FormularioGrupoLocalServiceUtil.updateFormularioGrupo(grupo);
    	
    	Solicitud solicitud = SolicitudLocalServiceUtil.getSolicitud(grupo.getSolicitudId());
    	solicitud.setFechaConfirmacionItinerario(new Date());
    	SolicitudLocalServiceUtil.updateSolicitud(solicitud);

    	SessionMessages.add(r, "enviado");
    	
    	response.setRenderParameter("codigoUnico", grupo.getCodigoUnico());
    	response.setRenderParameter("jspPage", "/views/solicitud/formulario.jsp");
	}
	
	public void limpiarFormulario(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException {
    	FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(text("codigoUnico", r));
    	
    	List<FormularioCoordinador> coordinadores = FormularioCoordinadorLocalServiceUtil.getByFormularioId(grupo.getId());
    	List<FormularioParticipante> participantes = FormularioParticipanteLocalServiceUtil.getByFormularioId(grupo.getId());
    	
    	for (FormularioCoordinador f : coordinadores)
    		FormularioCoordinadorLocalServiceUtil.deleteFormularioCoordinador(f);
    	
    	for (FormularioParticipante f : participantes)
    		FormularioParticipanteLocalServiceUtil.deleteFormularioParticipante(f);
    	
    	response.setRenderParameter("codigoUnico", grupo.getCodigoUnico());
    	response.setRenderParameter("jspPage", "/views/solicitud/formulario.jsp");
	}
	
	public void confirmarGrupo(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException {
		User usuario = obtenerUsuario(r);
		
		FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(text("codigoUnico", r));
    	grupo.setUsuarioAprobacion(usuario.getUserId());
    	grupo.setFechaAprobacion(new Date());
    	FormularioGrupoLocalServiceUtil.updateFormularioGrupo(grupo);

    	SessionMessages.add(r, "confirmadogrupo");
    	
		response.setRenderParameter("id", Long.toString(grupo.getSolicitudId()));
		response.setRenderParameter("jspPage", "/views/solicitud/ver.jsp");
	}
	
	public void cancelarGrupo(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, IOException {
    	FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(text("codigoUnico", r));
    	grupo.setFechaEnvio(null);
    	FormularioGrupoLocalServiceUtil.updateFormularioGrupo(grupo);

    	Solicitud solicitud = SolicitudLocalServiceUtil.getSolicitud(grupo.getSolicitudId());
    	solicitud.setFechaConfirmacionItinerario(null);
    	SolicitudLocalServiceUtil.updateSolicitud(solicitud);

    	SessionMessages.add(r, "canceladogrupo");
    	
		//response.setRenderParameter("id", Long.toString(grupo.getSolicitudId()));
		//response.setRenderParameter("jspPage", "/views/solicitud/ver.jsp");
    	response.sendRedirect(text("redirectTo", r));
	}
	
		
	public void altaSolicitudItinerario(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException {
		
		if ("seleccionarItinerario".equals(text("accion", r))) {
			Solicitud solicitud = SolicitudLocalServiceUtil.
					getSolicitud(Long.valueOf(text("id", r)).longValue());

			Set<Date> setDate = SolicitudItinerarioLocalServiceUtil.
					findFechasNoPosibles(Long.valueOf(text("itinerario", r)).longValue(),
					new Date(),
					solicitud.getCantidadParticipantes());

			StringBuilder jsListDate = new StringBuilder();

			int i = 0;
			for (Date date : setDate) {
				if (i++ > 0)
					jsListDate.append(",");

				Calendar cal = GregorianCalendar.getInstance();
				cal.setTime(date);

				jsListDate.append("new Date(");
				jsListDate.append(cal.get(Calendar.YEAR));
				jsListDate.append(", ");
				jsListDate.append(cal.get(Calendar.MONTH));
				jsListDate.append(", ");
				jsListDate.append(cal.get(Calendar.DAY_OF_MONTH));
				jsListDate.append(", 0, 0, 0, 0).valueOf()");
			}

			response.setRenderParameter("id", text("id", r));
			response.setRenderParameter("itinerario", text("itinerario", r));
			r.setAttribute("jsListDate", jsListDate.toString());
			response.setRenderParameter("jspPage", "/views/solicitud/asignarItinerario.jsp");

			return;
		}
		
		SolicitudItinerarioLocalServiceUtil.add(
				Long.valueOf(text("id", r)).longValue(),
				Long.valueOf(text("itinerario", r)).longValue(),
				new SimpleDateFormat("dd/MM/yyyy").parse(text("fecha", r)),
				new Date(),
				obtenerUsuario(r).getUserId());

		SessionMessages.add(r, "itinerarioAsignado");

		response.setRenderParameter("id", text("id", r));
		response.setRenderParameter("jspPage", "/views/solicitud/ver.jsp");

	}

	public void cancelarItinerario(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException {
		SolicitudItinerarioLocalServiceUtil.delete(
				Long.valueOf(text("id", r)).longValue(),
				new Date(),
				obtenerUsuario(r).getUserId());
		
		SessionMessages.add(r, "itinerarioCancelado");

		response.setRenderParameter("id", text("id", r));
		response.setRenderParameter("jspPage", "/views/solicitud/ver.jsp");
	}

	public void confirmarItinerario(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException {
		Solicitud solicitud = SolicitudLocalServiceUtil.
				getSolicitud(Long.valueOf(text("id", r)).longValue());

		solicitud.setFechaConfirmacionItinerario(new Date());

		SolicitudLocalServiceUtil.updateSolicitud(solicitud);
		
		SessionMessages.add(r, "itinerarioConfirmado");

		response.setRenderParameter("id", text("id", r));
		response.setRenderParameter("jspPage", "/views/solicitud/ver.jsp");

	}

	public void cancelarConfirmacionItinerario(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException {
		Solicitud solicitud = SolicitudLocalServiceUtil.
				getSolicitud(Long.valueOf(text("id", r)).longValue());

		solicitud.setFechaConfirmacionItinerario(null);

		SolicitudLocalServiceUtil.updateSolicitud(solicitud);

		SessionMessages.add(r, "itinerarioDesconfirmado");

		response.setRenderParameter("id", text("id", r));
		response.setRenderParameter("jspPage", "/views/solicitud/ver.jsp");

	}

	public void recorridoForm(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, IOException {

		if (text("id", r) == null || text("id", r).trim().equals("")) {
			List<Recorrido> listRecorrido = RecorridoLocalServiceUtil.findByNombreAndFechaBaja(text("nombre", r), null);
			
			if (listRecorrido != null && !listRecorrido.isEmpty()) {
				for (String parameterName : r.getParameterMap().keySet())
					response.setRenderParameter(parameterName, r.getParameter(parameterName));
				
	    		SessionErrors.add(r, "recorridoExistente");
	    		response.setRenderParameter("jspPage", "/views/recorrido/form.jsp");
	    		return;
			}

			RecorridoLocalServiceUtil.add(text("nombre", r),
					Long.valueOf(text("capacidad", r)),
					text("mails", r),
					obtenerUsuario(r).getUserId());
			
			SessionMessages.add(r, "success");
		}
		else {
			if ("remove".equals(text("accion", r))) {
				RecorridoLocalServiceUtil.baja(Long.valueOf(text("id", r)),
						obtenerUsuario(r).getUserId());
				
				SessionMessages.add(r, "eliminado");
			}
			else {
				List<Recorrido> listRecorrido = RecorridoLocalServiceUtil.findByNombreAndFechaBaja(text("nombre", r), null);
				
				if (listRecorrido != null && !listRecorrido.isEmpty() &&
						listRecorrido.get(0).getId() != Long.valueOf(text("id", r)).longValue()) {
					for (String parameterName : r.getParameterMap().keySet())
						response.setRenderParameter(parameterName, r.getParameter(parameterName));
					
		    		SessionErrors.add(r, "recorridoExistente");
		    		response.setRenderParameter("jspPage", "/views/recorrido/form.jsp");
		    		return;
				}
				
				RecorridoLocalServiceUtil.update(Long.valueOf(text("id", r)),
						text("nombre", r),
						Long.valueOf(text("capacidad", r)),
						text("mails", r));
				
				SessionMessages.add(r, "editada");
			}

		}

		response.sendRedirect(text("redirectTo", r));

	}

	public void itinerarioForm(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, WindowStateException, IOException {

		StringBuilder diasSemana = new StringBuilder();
		
		int i = 0;
		for (String parameterName : r.getParameterMap().keySet()) {
			if (parameterName.contains("dia_")) {
				if (i++ > 0)
					diasSemana.append(",");

				diasSemana.append(parameterName.split("_")[1]);
			}
		}

		if (text("id", r) == null || text("id", r).trim().equals("")) {
			Itinerario itinerario =
					ItinerarioLocalServiceUtil.add(text("modalidad", r),
					text("nombre", r),
					text("nombreCorto", r),
					text("descripcion", r),
					diasSemana.toString(),
					obtenerUsuario(r).getUserId());
			
			for (String parameterName : r.getParameterMap().keySet()) {
				if (parameterName.contains("recorrido_") && !parameterName.contains("hora_recorrido_")) {
					long idx = Long.valueOf(parameterName.split("_")[1]);
					long recorridoId = Long.valueOf(text("recorrido_" + idx, r));
					long hora = Long.valueOf(text("hora_" + idx, r));
					long duracion = Long.valueOf(text("duracion_" + idx, r));
					
					long hora1 = hora / 100;
					long minuto1 = hora % 100;

					for (int j = 0; j < duracion; j += 30) {						
						ItinerarioRecorridoLocalServiceUtil.add(itinerario.getId(), recorridoId, hora1 * 100 + minuto1);
						hora1 = minuto1 == 30L ? hora1 + 1L : hora1;
						minuto1 = minuto1 == 30L ? 0L : 30L;
					}

				}
			}

			SessionMessages.add(r, "success");
		}
		else {
			if ("remove".equals(text("accion", r))) {
				ItinerarioLocalServiceUtil.baja(Long.valueOf(text("id", r)), obtenerUsuario(r).getUserId());
				
				SessionMessages.add(r, "eliminado");
			}
			else {
				Itinerario itinerario = ItinerarioLocalServiceUtil.update(
						Long.valueOf(text("id", r)),
						text("modalidad", r),
						text("nombre", r),
						text("nombreCorto", r),
						text("descripcion", r),
						diasSemana.toString());
			
				ItinerarioRecorridoLocalServiceUtil.removeByItinerarioId(itinerario.getId());
			
				for (String parameterName : r.getParameterMap().keySet()) {
					if (parameterName.contains("recorrido_") && !parameterName.contains("hora_recorrido_")) {
						long idx = Long.valueOf(parameterName.split("_")[1]);
						long recorridoId = Long.valueOf(text("recorrido_" + idx, r));
						long hora = Long.valueOf(text("hora_" + idx, r));
						long duracion = Long.valueOf(text("duracion_" + idx, r));
						
						long hora1 = hora / 100;
						long minuto1 = hora % 100;

						for (int j = 0; j < duracion; j += 30) {							
							ItinerarioRecorridoLocalServiceUtil.add(itinerario.getId(), recorridoId, hora1 * 100 + minuto1);
							hora1 = minuto1 == 30L ? hora1 + 1L : hora1;
							minuto1 = minuto1 == 30L ? 0L : 30L;
						}
					}
				}
			
				SessionMessages.add(r, "editada");
			}
		}
		
		response.sendRedirect(text("redirectTo", r));

	}

	public void guiaForm(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, WindowStateException, IOException {

		StringBuilder diasSemana = new StringBuilder();
		
		int i = 0;
		for (String parameterName : r.getParameterMap().keySet()) {
			if (parameterName.contains("dia_")) {
				if (i++ > 0)
					diasSemana.append(",");

				diasSemana.append(parameterName.split("_")[1]);
			}
		}
		
		if (text("id", r) == null || text("id", r).trim().equals("")) {
			Guia guia =
					GuiaLocalServiceUtil.add(text("nombre", r),
					text("apellido", r),
					text("telefono", r),
					text("email", r),
					diasSemana.toString(),
					text("fechaInicio", r) != null && !text("fechaInicio", r).trim().equals("") ?
							new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaInicio", r)) : null,
					text("fechaFin", r) != null && !text("fechaFin", r).trim().equals("") ?
							new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaFin", r)) : null,
					obtenerUsuario(r).getUserId());			
			
			SessionMessages.add(r, "success");
		}
		else {
			if ("remove".equals(text("accion", r))) {
				GuiaLocalServiceUtil.baja(Long.valueOf(text("id", r)), obtenerUsuario(r).getUserId());
				
				SessionMessages.add(r, "eliminado");
			}
			else {

				Guia guia =
						GuiaLocalServiceUtil.update(Long.valueOf(text("id", r)),
						text("nombre", r),
						text("apellido", r),
						text("telefono", r),
						text("email", r),
						diasSemana.toString(),
						text("fechaInicio", r) != null && !text("fechaInicio", r).trim().equals("") ?
								new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaInicio", r)) : null,
						text("fechaFin", r) != null && !text("fechaFin", r).trim().equals("") ?
								new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaFin", r)) : null,
						obtenerUsuario(r).getUserId());			
						
				SessionMessages.add(r, "editada");
			}
		}
		
		response.sendRedirect(text("redirectTo", r));

	}

	public void feriadoForm(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, WindowStateException, IOException {

		if (text("id", r) == null || text("id", r).trim().equals("")) {
			Feriado feriado =
					FeriadoLocalServiceUtil.add(
							text("fechaDesde", r) != null && !text("fechaDesde", r).trim().equals("") ?
									new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaDesde", r)) : null,
							text("fechaHasta", r) != null && !text("fechaHasta", r).trim().equals("") ?
									new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaHasta", r)) : null,
							text("descripcion", r),
							obtenerUsuario(r).getUserId());			
			
			SessionMessages.add(r, "success");
		}
		else {
			if ("remove".equals(text("accion", r))) {
				FeriadoLocalServiceUtil.baja(Long.valueOf(text("id", r)), obtenerUsuario(r).getUserId());
				
				SessionMessages.add(r, "eliminado");
			}
			else {

				Feriado feriado =
						FeriadoLocalServiceUtil.update(Long.valueOf(text("id", r)),
								text("fechaDesde", r) != null && !text("fechaDesde", r).trim().equals("") ?
										new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaDesde", r)) : null,
								text("fechaHasta", r) != null && !text("fechaHasta", r).trim().equals("") ?
										new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaHasta", r)) : null,
								text("descripcion", r),
								obtenerUsuario(r).getUserId());			
						
				SessionMessages.add(r, "editada");
			}
		}
		
		response.sendRedirect(text("redirectTo", r));

	}
	
	
	public void licenciaGuiaForm(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, WindowStateException, IOException {

		if (text("id", r) == null || text("id", r).trim().equals("")) {
			LicenciaGuia licencia =
					LicenciaGuiaLocalServiceUtil.add(Long.valueOf(text("guiaId", r)),
					text("descripcion", r),
					text("fechaDesde", r) != null && !text("fechaDesde", r).trim().equals("") ?
							new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaDesde", r)) : null,
					text("fechaHasta", r) != null && !text("fechaHasta", r).trim().equals("") ?
							new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaHasta", r)) : null,
					obtenerUsuario(r).getUserId());			
			
			SessionMessages.add(r, "success");
		}
		else {
			if ("remove".equals(text("accion", r))) {
				LicenciaGuiaLocalServiceUtil.baja(Long.valueOf(text("id", r)), obtenerUsuario(r).getUserId());
				
				SessionMessages.add(r, "eliminado");
			}
			else {

				LicenciaGuia licencia =
						LicenciaGuiaLocalServiceUtil.update(Long.valueOf(text("id", r)),
						text("descripcion", r),
						text("fechaDesde", r) != null && !text("fechaDesde", r).trim().equals("") ?
								new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaDesde", r)) : null,
						text("fechaHasta", r) != null && !text("fechaHasta", r).trim().equals("") ?
								new SimpleDateFormat("yyyy-MM-dd").parse(text("fechaHasta", r)) : null,
						obtenerUsuario(r).getUserId());			
						
				SessionMessages.add(r, "editada");
			}
		}
		
		response.sendRedirect(text("redirectTo", r));

	}

	public void editarCoordinador(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, WindowStateException, IOException {

		FormularioCoordinador coord = FormularioCoordinadorLocalServiceUtil.getFormularioCoordinador(Long.valueOf(text("id", r)));
		
    	coord.setNombre(text("nombre", r));
    	coord.setApellido(text("apellido", r));
    	coord.setGenero(num("genero", r));
    	coord.setDni(text("dni", r));
    	coord.setTelefono(text("telefono", r));
    	coord.setMail(text("email", r));
    	coord.setEspecificacionesAlimenticias(text("especificacionesalimenticias", r));
    	coord.setEnfermedades(num("enfermedades", r).longValue());
    	coord.setObservaciones(text("observaciones", r));

    	FormularioCoordinadorLocalServiceUtil.updateFormularioCoordinador(coord);
		
		SessionMessages.add(r, "coordinadorEditado");
				
		response.sendRedirect(text("redirectTo", r));

	}

	public void editarParticipante(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, WindowStateException, IOException {

		FormularioParticipante part = FormularioParticipanteLocalServiceUtil.getFormularioParticipante(Long.valueOf(text("id", r)));
		
		part.setNombre(text("nombre", r));
		part.setApellido(text("apellido", r));
		part.setGenero(num("genero", r));
		part.setDni(text("dni", r));
		part.setTelEmergencia(text("telefono", r));
		part.setMail(text("email", r));
		part.setEspecificacionesAlimenticias(text("especificacionesalimenticias", r));
    	if (text("nacimiento", r) != null && !text("nacimiento", r).trim().equals("")) {
    		try {
    			part.setFechaNacimiento(new SimpleDateFormat("dd/MM/yyyy").parse(text("nacimiento", r)));
    		}
    		catch (Exception e) {
    		}
    	}
    	part.setEnfermedades(num("enfermedades", r).longValue());
    	part.setObservaciones(text("observaciones", r));

    	FormularioParticipanteLocalServiceUtil.updateFormularioParticipante(part);
		
		SessionMessages.add(r, "participanteEditado");
				
		response.sendRedirect(text("redirectTo", r));

	}

	public void cargarPlanillaCoordinador(ActionRequest r, ActionResponse response) throws Exception {

		UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(r);

		if (uploadRequest.getSize("archivo") == 0) {
			throw new Exception("Received file is 0 bytes!");
		}

		// Get the uploaded file as a file.
		File uploadedFile = uploadRequest.getFile("archivo");

		FileInputStream fis = new FileInputStream(uploadedFile);

		List<CoordinadorRow> listRow = null;

		try {
			listRow = ParsearCoordinadores.run(fis);
		} catch (Exception e) {
			e.printStackTrace();
			response.setRenderParameter("planillaCargada", "true");
			response.setRenderParameter("jspPage",
					"/views/solicitud/popup/cargarPlanillaCoordinador.jsp");
			SessionErrors.add(r, "planillaCoordinadorNoParseable");
			return;
		}
		finally {
			fis.close();
		}

		List<coba.excel.Error> listError = ValidarCoordinadores.run(listRow);
		
		Set<Long> setLong = new HashSet<Long>();
		for (coba.excel.Error error : listError) {
			setLong.add(Long.valueOf(error.getNumeroLinea()));
		}

		if (!listError.isEmpty()) {
			r.setAttribute("listError", listError);
			r.setAttribute("cantidadRows", Integer.valueOf(listRow.size()));
			r.setAttribute("cantidadRowsErroneos", Integer.valueOf(setLong.size()));
			response.setRenderParameter("jspPage",
					"/views/solicitud/popup/erroresPlanillaCoordinador.jsp");
			return;
		}

		for (CoordinadorRow row : listRow) {
			long id = this.generarId(FormularioCoordinador.class);
			FormularioCoordinador form = FormularioCoordinadorLocalServiceUtil.getService().createFormularioCoordinador(id);

			FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(
					(String)PortalUtil.getHttpServletRequest(r).getSession().
							getAttribute("solicitud_formulario_codigoUnico"));

			form.setFormularioId(grupo.getId());
			form.setNombre(row.getNombre());
			form.setApellido(row.getApellido());
			form.setGenero(row.getGenero().trim().equals("FEMENINO") ? 1 : 0);
			form.setDni(row.getDni());
			form.setTelefono(row.getTelefono());
			form.setMail(row.getEmail());
			form.setEspecificacionesAlimenticias(row.getEspecificacionAlimenticia());
			form.setEnfermedades(EnfermedadIdFromNombre.run(row.getEnfermedades()));
			form.setObservaciones(row.getObservaciones());

	    	FormularioCoordinadorLocalServiceUtil.addFormularioCoordinador(form);
		}

		response.setRenderParameter("planillaCargada", "true");
		response.setRenderParameter("jspPage",
				"/views/solicitud/popup/cargarPlanillaCoordinador.jsp");
		SessionMessages.add(r, "planillaCoordinadorCargada");

	}

	public void cargarPlanillaParticipante(ActionRequest r, ActionResponse response) throws Exception {

		UploadPortletRequest uploadRequest = PortalUtil.getUploadPortletRequest(r);

		if (uploadRequest.getSize("archivo") == 0) {
			throw new Exception("Received file is 0 bytes!");
		}

		// Get the uploaded file as a file.
		File uploadedFile = uploadRequest.getFile("archivo");

		FileInputStream fis = new FileInputStream(uploadedFile);

		List<ParticipanteRow> listRow = null;
		
		try {
			listRow = ParsearParticipantes.run(fis);
		} catch (Exception e) {
			e.printStackTrace();
			response.setRenderParameter("planillaCargada", "true");
			response.setRenderParameter("jspPage",
					"/views/solicitud/popup/cargarPlanillaParticipante.jsp");
			SessionErrors.add(r, "planillaParticipanteNoParseable");
			return;
		}
		finally {
			fis.close();
		}

		List<coba.excel.Error> listError = ValidarParticipantes.run(listRow);
		
		Set<Long> setLong = new HashSet<Long>();
		for (coba.excel.Error error : listError) {
			setLong.add(Long.valueOf(error.getNumeroLinea()));
		}

		if (!listError.isEmpty()) {
			r.setAttribute("listError", listError);
			r.setAttribute("cantidadRows", Integer.valueOf(listRow.size()));
			r.setAttribute("cantidadRowsErroneos", Integer.valueOf(setLong.size()));
			response.setRenderParameter("jspPage",
					"/views/solicitud/popup/erroresPlanillaCoordinador.jsp");
			return;
		}

		for (ParticipanteRow row : listRow) {
			long id = this.generarId(FormularioParticipante.class);
			FormularioParticipante form = FormularioParticipanteLocalServiceUtil.getService().createFormularioParticipante(id);

			FormularioGrupo grupo = FormularioGrupoLocalServiceUtil.getByCodigoUnico(
					(String)PortalUtil.getHttpServletRequest(r).getSession().
							getAttribute("solicitud_formulario_codigoUnico"));

			form.setFormularioId(grupo.getId());
			form.setNombre(row.getNombre());
			form.setApellido(row.getApellido());
			form.setGenero(row.getGenero().trim().equals("FEMENINO") ? 1 : 0);
			form.setDni(row.getDni());
			form.setTelEmergencia(row.getTelefono());
			form.setMail(row.getEmail());
			form.setFechaNacimiento(row.getFechaNacimiento());
			form.setEspecificacionesAlimenticias(row.getEspecificacionAlimenticia());
			form.setEnfermedades(EnfermedadIdFromNombre.run(row.getEnfermedades()));
			form.setObservaciones(row.getObservaciones());

	    	FormularioParticipanteLocalServiceUtil.addFormularioParticipante(form);
		}

		response.setRenderParameter("planillaCargada", "true");
		response.setRenderParameter("jspPage",
				"/views/solicitud/popup/cargarPlanillaParticipante.jsp");
		SessionMessages.add(r, "planillaParticipanteCargada");

	}

	public void sarlanga(ActionRequest r, ActionResponse response) throws SystemException, PortalException, ParseException, WindowStateException, IOException {

		response.setRenderParameter("jspPage", "/views/json/prueba.jsp");

	}
	
	public void serveResource(ResourceRequest req, ResourceResponse res)
			throws PortletException, IOException {

		String resourceRequest = ParamUtil.getString(req, "resourceRequest");

		//HttpServletRequest request = PortalUtil.getHttpServletRequest(req);

		//HttpSession session = request.getSession();

		//ThemeDisplay themeDisplay = (ThemeDisplay)req.getAttribute(WebKeys.THEME_DISPLAY);

		//Company company = themeDisplay.getCompany();

		if(resourceRequest != null && resourceRequest.equals("pdf")) {
		/*
	        	try {                
	                    String msg = "Latest Weather Report";
	                    
	                    Document document = new Document();
	                    
	                    ByteArrayOutputStream baos = new ByteArrayOutputStream();
	                    
	                    PdfWriter.getInstance(document, baos);
	                    
	                    document.open();
	                    document.add(new Paragraph(msg));
	                    document.add(Chunk.NEWLINE);
	                    document.add(new Paragraph("It is a sunny day today."));
	                    document.close();
	                    
	                    res.setContentType("application/pdf");
	                    res.addProperty(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate");
	                    
	                    res.setContentLength(baos.size());
	                    
	                    OutputStream out = res.getPortletOutputStream();
	                    baos.writeTo(out);
	                    
	                    out.flush();
	                    out.close();
	        	} catch (Exception e2) {
	                    e2.System.out.println("Error in " + getClass().getName() + "\n" + e2);
	        	}
			*/
		}
		else if (resourceRequest != null && resourceRequest.equals("solicitud_listado_downloadExcel")) {
			try {

				HttpSession session = PortalUtil.getHttpServletRequest(req).getSession();
				Map<String, String> mapCriterio = CreateFilterMapFromSession.create(session);
				List<SolicitudId> listSolicitudId = SQLSolicitudes.findByMap(mapCriterio, 0, 1000);

				XSSFWorkbook workbook = new XSSFWorkbook();
				XSSFSheet sheet = workbook.createSheet();
				DumpSolicitudesIntoSheet.dump(sheet, listSolicitudId);

				res.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
				res.setProperty("content-disposition", "attachment; filename=solicitudes.xlsx");
				res.addProperty(HttpHeaders.CACHE_CONTROL, "max-age=3600, must-revalidate");

				OutputStream out = res.getPortletOutputStream();
				workbook.write(out);
				out.flush();
				out.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
	
	private User obtenerUsuario(ActionRequest request) {
		ThemeDisplay themeDisplay = (ThemeDisplay) request.getAttribute(WebKeys.THEME_DISPLAY);
		return themeDisplay.getUser();
	}
	
	private long generarId(Class<?> clase) throws SystemException {
		return CounterLocalServiceUtil.increment(clase.getName());
	}
	
	private Integer num(String parametro, ActionRequest request) {
		return Integer.parseInt(text(parametro, request));
	}
	
	private String text(String parametro, ActionRequest request) {
		return request.getParameter(parametro);
	}
}
